println 1>>2
println 1<<2+1
//def forward(s1, p1, p2, s2, q1, q2, m) {// DPA on s1[p1..p2) and s2[q1..q2)
//
//	def i, j;
//   	m[p1%2][q1] = 0.0; // boundary conditions
//   	for(j=q1+1; j <= q2; j++) {
//		m[p1%2][j] = m[p1%2][j-1] + 1;
//	}
//   	for(i=p1+1; i <= p2; i++) {    // outer loop
//    	m[i%2][q1] = m[(i-1)%2][q1] + 1; // boundary conditions
//
//      	for(j=q1+1; j <= q2; j++) {	// inner loop
//       		var diag = m[(i-1)%2][j-1];
//         	if( s1.charAt(i-1) != s2.charAt(j-1) ) diag += 1;
//
//         	m[i%2][j] = Math.min( diag, Math.min( m[(i-1)%2][j]+1, m[i%2][j-1]+1 ) )
//		}//for j
//	}//for i
//}//fwdDPA
//
//def backward(s1, p1, p2, s2, q1, q2, m) {	// DPA on reverse(s1[p1..p2)) and reverse(s2[q1..q2))
//	
//	var i, j;
//	m[p2%2][q2] = 0.0; // boundary conditions
//	for(j=q2-1; j >= q1; j--) {
//		m[p2%2][j] = m[p2%2][j+1]+1;
//	}
//   	for(i=p2-1; i >= p1; i--) {
//   		m[i%2][q2] = m[(i+1)%2][q2] + 1;
//      	for(j=q2-1; j >= q1; j--) {
//      		var diag = m[(i+1)%2][j+1];
//         	if( s1.charAt(i) != s2.charAt(j) ) diag += 1;
//         	m[i%2][j] = Math.min( diag, Math.min( m[(i+1)%2][j]+1, m[i%2][j+1]+1));
//		}
//	}
//}//revDPA
//
//def row1, row2, row3
//
//// align s1[p1..p2) with s2[q1..q2)
//def align(s1, p1, p2, s2, q1, q2, L) { 
//
//	println "align ${L}"
//	for (int i = 1; i < L; i++) {
//   		if( p2-0 <= p1 ) {			// s1 is empty string
//      		for(i=q1; i < q2; i++) {
//      			row1 += '-'; row2 += ' '; row3 += s2.charAt(i);
//      		}
//       	} else if( q2-0 <= q1 ) {	// s2 is empty string
//      		for(i=p1; i < p2; i++) {
//      			row1 += s1.charAt(i); row2 += ' '; row3 += '-';
//      		}
//		} else if( p2-1 == p1 ) {	// s1 is one character and s2 is not empty
//    		var ch = s1.charAt(p1), memo = q1;
//      		for(i=q1+1; i < q2; i++) if(s2.charAt(i) == ch) memo=i;
//      		for(i=q1; i < q2; i++) {
//      			if(i == memo) {
//      				row1 += ch;
//            		if(s2.charAt(i) == ch) row2 += '|'; else row2 += ' ';
//          		} else {
//          			row1 += '-'; row2 += ' ';
//          		}
//          	}
//         	row3 += s2.charAt(i);
//		} else {	// p2>p1+1, s1 has at least 2 chars,  divide s1 and conquer.
//			mid = Math.floor((p1+p2)/2);
//			forward(s1, p1, mid, s2, q1, q2, fwd);
//			backward(s1, mid, p2, s2, q1, q2, rev);
//			var s2mid = q1, best = Number.MAX_VALUE;
//			for(i = q1; i <= q2; i++) {	// look for cheapest split of s2
//				var sum = fwd[mid%2][i]+rev[mid%2][i];
//			 	if( sum-0 < best ) { 
//			 		best=sum; s2mid=i;
//			 	}
//			}
//			align(s1, p1, mid, s2, q1, s2mid, L+1);
//			align(s1, mid, p2, s2, s2mid, q2, L+1);
//		}
//    }
//}//align
// 
// //------------------------------------------------------------
//// TEST
////------------------------------------------------------------
////def A = new File(/D:\develop\Groovy\Test\SearchUtils.v1.java/).getText().split("\r\n")
////def B = new File(/D:\develop\Groovy\Test\SearchUtils.v2.java/).getText().split("\r\n")
//
////def A = new File(/D:\develop\Groovy\Test\Test.v1.java/).getText().split("\r\n")
////def B = new File(/D:\develop\Groovy\Test\Test.v2.java/).getText().split("\r\n")
//
//def A = ("ABCBD"*129).toCharArray()
//def B = ("BDCAB"*129).toCharArray()
//
//align(A, 0, A.size(), B, 0, B.size(), 1)
//
//println row1
//println row2
//println row3